#ifndef __LM_MACRO_H__
#define __LM_MACRO_H__

#include "../common/lm_list.h"
#include <stdio.h>
#include <unistd.h>

typedef struct lm_array_node {
    lm_list_node_t node;
    char *string;

}lm_array_node_t;


typedef struct lm_array {
    lm_list_node_t head;
    int count;

}lm_array_t;


typedef struct lm_macro {
    struct lm_macro *parent;
    lm_list_node_t  node;
    lm_list_node_t  head;
    char           *name;
    char           *description;
    lm_array_t     choice;
    char           *value;
    char           *depend;
    bool           enable;
    bool           menu;
    int            count;

}lm_macro_t;


#ifdef __cplusplus
extern "C" {
#endif

lm_macro_t* lm_macro_get_menu_first_macro(lm_macro_t *menu);
lm_macro_t* lm_macro_get_menu_last_macro(lm_macro_t *menu);
lm_macro_t* lm_macro_list_get_next(lm_macro_t *macro);
lm_macro_t* lm_macro_list_get_prev(lm_macro_t *macro);
void lm_macro_list_add(lm_macro_t *menu, lm_macro_t *macro);
lm_macro_t* lm_macro_new(char* name);
lm_macro_t* lm_macro_new_and_add(lm_macro_t *menu, char* name);
lm_macro_t* lm_macro_add_menu(lm_macro_t *menu, char *desc);
void lm_macro_parent_set(lm_macro_t *macro, lm_macro_t *parent);
lm_macro_t *lm_macro_parent_get(lm_macro_t *macro);
int lm_macro_desc_add(lm_macro_t* macro, char *desc);
int lm_macro_value_add(lm_macro_t* macro, char *value);
void lm_macro_enable_set(lm_macro_t* macro, bool flag);
int lm_array_add_string(lm_array_t *array, char *str);
int lm_array_delete(lm_array_t *array);
int lm_macro_choice_add(lm_macro_t* macro, char* str);
void lm_macro_choice_set(lm_macro_t* macro, lm_array_t array);
char *lm_macro_choice_get_first(lm_macro_t* macro);
int lm_macro_depend_add(lm_macro_t* macro, char* str);
char* lm_macro_depend_get(lm_macro_t* macro);
int lm_macro_description_add(lm_macro_t* macro, char* str);
int lm_macro_delete(lm_macro_t* macro);
int lm_macro_list_delete(lm_macro_t *menu);
lm_macro_t *lm_macro_search_by_name(lm_macro_t *menu, char *macro_name);
char *lm_macro_get_description(lm_macro_t *menu, char *macro_name);
char *lm_macro_get_select(char *macro_name);
lm_macro_t *lm_macro_get_parent(lm_macro_t* macro);
void lm_array_print( FILE* output, lm_array_t *array);
void lm_macro_print_all_attr(lm_macro_t *menu, FILE* output);


#ifdef __cplusplus
} /*extern "C"*/
#endif


#endif //! __LM_MACRO_H__